package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.subject.Subject;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController{

    @Autowired
    private UserService userService;

    @Autowired
    private DeptService deptService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /*
        作用：进入用户的列表页面
        路径： /system/user/list.do
        参数： 没有
        返回值： system/user/user-list.jsp
     */
    @RequestMapping("/list")
    @RequiresPermissions("用户管理")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize
                      ){
        //硬编码做权限校验
      /*  Subject subject = SecurityUtils.getSubject();
        subject.checkPermission("用户管理");*/


        //1. 模拟获取登陆的企业id
        String companyId = getLoginCompanyId();
        //2.  查找到用户
        PageInfo<User> pageInfo = userService.findAll(pageNum, pageSize, companyId);
        //3. 把用户信息存储到域中
        request.setAttribute("pageInfo",pageInfo);
        //4. 返回用户列表
        return "system/user/user-list";
    }

    /*
      作用：进入用户的添加
      路径： /system/user/toAdd.do
      参数： 没有
      返回值： system/user/user-add.jsp
   */
    @RequestMapping("/toAdd")
    public String toAdd(){
        //1. 查询所有用户
        String companyId = getLoginCompanyId();
        List<Dept> deptList = deptService.findAllDept(companyId);
        //2. 存储到请求域中
        request.setAttribute("deptList",deptList);
        //3. 返回到用户的添加页面
        return "system/user/user-add";
    }


    /*
     作用：保存添加与修改
     路径： /system/user/edit.do
     参数： 用户
     返回值：用户列表
  */
    @RequestMapping("/edit")
    public String edit(User user){
        //1. 给用户补充企业的id与企业名称
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();
        user.setCompanyId(companyId);
        user.setCompanyName(companyName);
        //2.根据用户的id判断是否是增加还是修改
        if(StringUtils.isEmpty(user.getId())){
            //添加
            userService.save(user);
            //发送消息到rabbitmq中
            rabbitTemplate.convertAndSend("email-exchange","user.add",user);
        }else{
            //修改
            userService.update(user);


        }
        //3. 返回用户的列表页面
        return "redirect:/system/user/list.do";
    }


    /*
       作用：进入修改页面
       路径： /system/user/toUpdate.do?id=5af45318-6585-4e8b-85c6-75c1f3bf2c9f
       参数： 用户的id
       返回值：system/user/user-update
    */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //1. 根据id查询当前用户
        User user = userService.findById(id);
        request.setAttribute("user",user);
        //2. 查询所有用户 ： 作业： 查询全部用户的时候把当前用户排除在外，因为自己没法做自己的父用户
        String companyId = getLoginCompanyId();
        List<Dept> deptList = deptService.findAllDept(companyId);
        //2. 存储到请求域中
        request.setAttribute("deptList",deptList);
        //3. 返回更新页面
        return "system/user/user-update";
    }

    /*
         作用：删除用户
         路径： /system/user/delete.do
         参数： 用户的id
         返回值：json对象
     */
    @RequestMapping("/delete")
    @ResponseBody
    public Map<String,Object> delete(String id){
        //1. 删除用户
        boolean flag = userService.delete(id);
        //2.判断是否删除成功
        Map<String,Object> map = new HashMap<>();
        map.put("flag",flag);
        if(flag){
            map.put("message","删除成功");
        }else{
            map.put("message","该用户还没有被解除角色，不能直接删除");
        }
        return map;
    }


    /*
      作用：用户分配角色页面
      路径：/system/user/roleList.do?id=002108e2-9a10-4510-9683-8d8fd1d374ef
      参数： 用户的id
      返回值：system/user/user-role
   */
    @RequestMapping("/roleList")
    public String roleList(String id){
        //1. 查找到当前的用户
        User user = userService.findById(id);
        //2. 查找到所有的角色
        String companyId = getLoginCompanyId();
        List<Role> roleList = roleService.findAllRole(companyId);
        //3. 查找到当前用户已经具备的角色id
        List<String> userRoleIds = roleService.findUserRoleByUserId(id);

        //存储到请求域
        request.setAttribute("user",user);
        request.setAttribute("roleList",roleList);
        request.setAttribute("userRoleStr",userRoleIds.toString());
        return "system/user/user-role";
    }

    /*
     作用：保存修改用户的角色
     路径：/system/user/changeRole.do
     参数： userid : 用户的id  roleIds: 角色的id
     返回值：用户列表页面
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userid,String[] roleIds){
        userService.changeRole(userid,roleIds);
        return "redirect:/system/user/list.do";
    }
}
